#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python常用模块库 
@File ：shared_memory.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2025/2/20 上午12:48 
"""

from typing import Any, Optional
from .core.memory_manager import MemoryManager
from .core.lock import Lock
from .core.serialization import serialize, deserialize
from .utils.error import SharedMemoryError
from .utils.validator import validate_name, validate_size


class SharedMemory:
    """共享内存的高级接口，用于多进程或多线程间数据通信。

    Args:
        name (str): 共享内存的唯一标识符。
        size (int): 共享内存的大小（字节）。
        create (bool): 是否创建新的共享内存，默认为 True。
    """

    def __init__(self, name: str, size: int, create: bool = True) -> None:
        validate_name(name)
        validate_size(size)
        self.name = name
        self.size = size
        self.manager = MemoryManager(name, size, create)
        self.lock = Lock(name)

    def write(self, data: Any, offset: int = 0) -> None:
        """将数据写入共享内存。

        Args:
            data: 要写入的数据（支持任意可序列化对象）。
            offset (int): 写入的起始偏移量，默认为 0。

        Raises:
            SharedMemoryError: 如果写入失败或数据超出内存大小。
        """
        try:
            serialized_data = serialize(data)
            if offset + len(serialized_data) > self.size:
                raise SharedMemoryError(
                    f"Data size ({len(serialized_data)} bytes) exceeds available memory at offset {offset}")
            with self.lock:
                self.manager.write(serialized_data, offset)
        except Exception as e:
            raise SharedMemoryError(f"Failed to write to shared memory: {str(e)}")

    def read(self, offset: int = 0, size: Optional[int] = None) -> Any:
        """从共享内存读取数据。

        Args:
            offset (int): 读取的起始偏移量，默认为 0。
            size (int, optional): 要读取的字节数，默认为 None（读取剩余所有数据）。

        Returns:
            数据对象（反序列化后的结果）。

        Raises:
            SharedMemoryError: 如果读取失败。
        """
        try:
            with self.lock:
                if size is None:
                    size = self.size - offset
                data = self.manager.read(offset, size)
            return deserialize(data)
        except Exception as e:
            raise SharedMemoryError(f"Failed to read from shared memory: {str(e)}")

    def close(self) -> None:
        """关闭共享内存资源。"""
        self.manager.close()

    def unlink(self) -> None:
        """删除共享内存资源。"""
        self.manager.unlink()

    def __enter__(self) -> "SharedMemory":
        return self

    def __exit__(self, exc_type, exc_val, exc_tb) -> None:
        self.close()